#ifndef GY_MULTILEVELTREE_H
#define GY_MULTILEVELTREE_H

#include "GY_TreeView.h"

class  GY_CONTROLLIBRARY_EXPORT GY_MultilevelTree : public GY_TreeView
{
    Q_OBJECT
public:
    explicit GY_MultilevelTree(QWidget *parent = nullptr,QVariant cuttentMultilevelID=QVariant());
//-----------------------------多级树设置接口--------------------------------------
    /**
     * @brief addMultileveTree 添加多级树
     * @param multileveID 多级ID
     * @param parentRowID 父级行ID
     * @return
     */
    bool addMultileveTree(const QVariant& multileveID,const QVariant& parentRowID);
    /**
     * @brief deleteMultileveTree 删除多级树
     * @param multileveID 多级ID
     */
    void deleteMultileveTree(const QVariant &multileveID);
//-----------------------------多级树列接口--------------------------------------
    /**
     * @brief addColumn 添加列数
     * @param columnName 添加的列名
     * @param multileveID 多级ID
     */
    void addMultileveTreeColumn(const QString &columnName, const QVariant& multileveID=QVariant());
    /**
     * @brief insterColumn 插入列
     * @param index 插入在第几列
     * @param columnName 插入的列名
     * @param multileveID 多级ID
     * @return 返回插入列是否成功
     */
    bool insterMultileveTreeColumn(const int index, const QString &columnName,const QVariant& multileveID=QVariant());
    /**
     * @brief deleteColumn 删除列
     * @param index 删除的第几列
     * @param multileveID 多级ID
     * @return 返回删除列是否成功
     */
    bool deleteMultileveTreeColumn(const int index,const QVariant& multileveID=QVariant());
//-----------------------------多级树行接口--------------------------------------
    /**
     * @brief isHaveRow  是否有行
     * @param rowID  行ID
     * @return 是否存在该行
     */
    bool isHaveRow(const QVariant& rowID);
    /**
     * @brief addRowData  添加行数据
     * @param rowID 行Id
     * @param rowData 行数据
     * @param nodeParentId 父级Id
     * @return 返回添加是否成功
     */
    bool addMultileveTreeRowData(const QVariant &rowID, const QVector<QVariant>&rowData, const QVariant &nodeParentId=QVariant(),const QVariant& multileveID=QVariant(), const QVariant &iconType=QVariant());
    /**
     * @brief insterRowData   插入行数据
     * @param rowID 节点id
     * @param rowData 插入的行数据
     * @param index 引索第几个
     * @param nodeParentId 父级Id0
     * @return 返回插入行数据是否成功
     */
    bool insterMultileveTreeRowData(const QVariant &rowID, const QVector<QVariant>&rowData,const int index, const QVariant &nodeParentId=QVariant(),const QVariant& multileveID=QVariant(), const QVariant iconType=QVariant());
    /**
     * @brief deleteRow  删除指定行
     * @param rowID 删除行的id号
     * @return 返回删除是否成功
     */
    bool deleteMultileveTreeRow(const QVariant &rowId);
    /**
     * @brief setRowData  修改行数据
     * @param rowId  修改行id
     * @param rowData  要修改的数据
     * @return 是否修改成功
     */
    bool setMultileveTreeRowData(const QVariant &rowID, const QVector<QVariant>&rowData);
    /**
     * @brief setCellData  修改单元格数据
     * @param rowID  修改的行id
     * @param columnIndex  修改第几列
     * @param cellData  要修改的数据
     * @return 是否修改成功
     */
    bool setMultileveTreeCellData(const QVariant &rowID, const int columnIndex, const QVariant &cellData);
    /**
     * @brief getRowData  通过id获取行数据
     * @param rowID 要获取的节点id
     * @return 返回id对应的行数据
     */
    QVector<QVariant> getMultileveTreeRowData(const QVariant &rowID);
    /**
     * @brief getCellData  获取单元格数据
     * @param rowID  节点id
     * @param columnIndex  索引第几列
     * @param data  单元格的数据
     * @return 返回是否获取成功
     */
    bool getMultileveTreeCellData(const QVariant &rowID, const int columnIndex, QVariant &data);
protected:
    /**
     * @brief The MultilevelInfo struct
     * 多级信息结构体
     */
    struct MultilevelInfo
    {
        //!多级ID
        QVariant multilevelID;
        //!父级行ID
        QVariant parentRowID;
        //!父级ID
        QVariant parentMultilevelID;
        //!控件树指针
        GY_MultilevelTree* pMultilevelTree;
    };
    //!多级信息Map
    QMap<QVariant,MultilevelInfo> m_MultilevelInfoMap;
    //!当前层级多级ID
    QVariant m_CuttentMultilevelID;
    /**
     * @brief The SpanInfo struct
     * 单元格合并信息
     */
    struct SpanInfo
    {
        //!单元格开始位置
        int firstSection;
        //!单元格结束位置
        int lastSection;
    };
    //!单元格合并信息
    QMap<QStandardItem*,SpanInfo> m_SpanInfoMap;
protected:
    void drawRow(QPainter* paniter,const QStyleOptionViewItem& option,const QModelIndex& index) const;
signals:

};

#endif // GY_MULTILEVELTREE_H
